// Package sysin
// @Link  https://github.com/bufanyun/hotgo
// @Copyright  Copyright (c) 2024 HotGo CLI
// @Author  Ms <133814250@qq.com>
// @License  https://github.com/bufanyun/hotgo/blob/master/LICENSE
// @AutoGenerate Version 2.15.7
package sysin

import (
	"context"
	"hotgo/internal/consts"
	"hotgo/internal/model/entity"
	"hotgo/internal/model/input/form"
	"hotgo/utility/validate"

	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gtime"
)

// StoreOrderUpdateFields 修改订单字段过滤
type StoreOrderUpdateFields struct {
	OrderNo        string      `json:"orderNo"        dc:"订单号"`
	Status         int         `json:"status"         dc:"订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成"`
	RealFee        int         `json:"realFee"        dc:"订单实际支付总价（分）"`
	AddressCode    string      `json:"addressCode"    dc:"省/市/县编码"`
	Name           string      `json:"name"           dc:"收货人姓名"`
	Mobile         string      `json:"mobile"         dc:"收货人电话"`
	Address        string      `json:"address"        dc:"收货地址"`
	PlatformRemark string      `json:"platformRemark" dc:"平台备注"`
	PayType        string      `json:"payType"        dc:"支付方式：wx=微信，score=积分"`
	PayNo          string      `json:"payNo"          dc:"支付订单号"`
	PaidAt         *gtime.Time `json:"paidAt"         dc:"支付时间"`
	ExpressCom     string      `json:"expressCom"     dc:"快递公司编码"`
	ExpressNum     string      `json:"expressNum"     dc:"快递公司单号"`
}

// StoreOrderInsertFields 新增订单字段过滤
type StoreOrderInsertFields struct {
	OrderNo        string      `json:"orderNo"        dc:"订单号"`
	Status         int         `json:"status"         dc:"订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成"`
	RealFee        int         `json:"realFee"        dc:"订单实际支付总价（分）"`
	AddressCode    string      `json:"addressCode"    dc:"省/市/县编码"`
	Name           string      `json:"name"           dc:"收货人姓名"`
	Mobile         string      `json:"mobile"         dc:"收货人电话"`
	Address        string      `json:"address"        dc:"收货地址"`
	PlatformRemark string      `json:"platformRemark" dc:"平台备注"`
	PayType        string      `json:"payType"        dc:"支付方式：wx=微信，score=积分"`
	PayNo          string      `json:"payNo"          dc:"支付订单号"`
	PaidAt         *gtime.Time `json:"paidAt"         dc:"支付时间"`
	ExpressCom     string      `json:"expressCom"     dc:"快递公司编码"`
	ExpressNum     string      `json:"expressNum"     dc:"快递公司单号"`
}

// StoreOrderEditInp 修改/新增订单
type StoreOrderEditInp struct {
	entity.StoreOrder
}

func (in *StoreOrderEditInp) Filter(ctx context.Context) (err error) {
	// 验证订单号
	if err := g.Validator().Rules("required").Data(in.OrderNo).Messages("订单号不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成
	if err := g.Validator().Rules("required").Data(in.Status).Messages("订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证订单实际支付总价（分）
	if err := g.Validator().Rules("required").Data(in.RealFee).Messages("订单实际支付总价（分）不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证收货人姓名
	if err := g.Validator().Rules("required").Data(in.Name).Messages("收货人姓名不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证收货人电话
	if err := g.Validator().Rules("phone").Data(in.Mobile).Messages("收货人电话不是手机号码").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证收货地址
	if err := g.Validator().Rules("required").Data(in.Address).Messages("收货地址不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证支付方式：wx=微信，score=积分
	if err := g.Validator().Rules("required").Data(in.PayType).Messages("支付方式：wx=微信，score=积分不能为空").Run(ctx); err != nil {
		return err.Current()
	}
	if err := g.Validator().Rules("in:GET,POST").Data(in.PayType).Messages("支付方式：wx=微信，score=积分值不正确").Run(ctx); err != nil {
		return err.Current()
	}

	// 验证支付订单号
	if err := g.Validator().Rules("required").Data(in.PayNo).Messages("支付订单号不能为空").Run(ctx); err != nil {
		return err.Current()
	}

	return
}

type StoreOrderEditModel struct{}

// StoreOrderDeleteInp 删除订单
type StoreOrderDeleteInp struct {
	Id interface{} `json:"id" v:"required#主键id不能为空" dc:"主键id"`
}

func (in *StoreOrderDeleteInp) Filter(ctx context.Context) (err error) {
	return
}

type StoreOrderDeleteModel struct{}

// StoreOrderViewInp 获取指定订单信息
type StoreOrderViewInp struct {
	Id int `json:"id" v:"required#主键id不能为空" dc:"主键id"`
}

func (in *StoreOrderViewInp) Filter(ctx context.Context) (err error) {
	return
}

type StoreOrderViewModel struct {
	entity.StoreOrder
}

// StoreOrderListInp 获取订单列表
type StoreOrderListInp struct {
	form.PageReq
	OrderNo   string        `json:"orderNo"   dc:"订单号"`
	Status    int           `json:"status"    dc:"订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成"`
	Mobile    string        `json:"mobile"    dc:"收货人电话"`
	CreatedAt []*gtime.Time `json:"createdAt" dc:"创建时间"`
}

func (in *StoreOrderListInp) Filter(ctx context.Context) (err error) {
	return
}

type StoreOrderListModel struct {
	Id             int         `json:"id"             dc:"主键id"`
	Nickname       string      `json:"nickname"       dc:"用户昵称"`
	OrderNo        string      `json:"orderNo"        dc:"订单号"`
	Status         int         `json:"status"         dc:"订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成"`
	TotalFee       int         `json:"totalFee"       dc:"订单总价（分）"`
	RealFee        int         `json:"realFee"        dc:"订单实际支付总价（分）"`
	Mobile         string      `json:"mobile"         dc:"收货人电话"`
	PlatformRemark string      `json:"platformRemark" dc:"平台备注"`
	PayType        string      `json:"payType"        dc:"支付方式：wx=微信，score=积分"`
	PayNo          string      `json:"payNo"          dc:"支付订单号"`
	PaidAt         *gtime.Time `json:"paidAt"         dc:"支付时间"`
	ExpressCom     string      `json:"expressCom"     dc:"快递公司编码"`
	ExpressNum     string      `json:"expressNum"     dc:"快递公司单号"`
}

// StoreOrderExportModel 导出订单
type StoreOrderExportModel struct {
	Id             int         `json:"id"             dc:"主键id"`
	Nickname       string      `json:"nickname"       dc:"用户昵称"`
	OrderNo        string      `json:"orderNo"        dc:"订单号"`
	Status         int         `json:"status"         dc:"订单状态：-1=已关闭，0=待付款，1=待发货，2=待收货，3=已完成"`
	TotalFee       int         `json:"totalFee"       dc:"订单总价（分）"`
	RealFee        int         `json:"realFee"        dc:"订单实际支付总价（分）"`
	CompleteAt     *gtime.Time `json:"completeAt"     dc:"完成时间"`
	AddressName    string      `json:"addressName"    dc:"省/市/县"`
	Mobile         string      `json:"mobile"         dc:"收货人电话"`
	Address        string      `json:"address"        dc:"收货地址"`
	PlatformRemark string      `json:"platformRemark" dc:"平台备注"`
	PayType        string      `json:"payType"        dc:"支付方式：wx=微信，score=积分"`
	PayNo          string      `json:"payNo"          dc:"支付订单号"`
	PaidAt         *gtime.Time `json:"paidAt"         dc:"支付时间"`
	ExpressCom     string      `json:"expressCom"     dc:"快递公司编码"`
	ExpressNum     string      `json:"expressNum"     dc:"快递公司单号"`
	CreatedAt      *gtime.Time `json:"createdAt"      dc:"创建时间"`
}

// StoreOrderStatusInp 更新订单状态
type StoreOrderStatusInp struct {
	Id     int `json:"id" v:"required#主键id不能为空" dc:"主键id"`
	Status int `json:"status" dc:"状态"`
}

func (in *StoreOrderStatusInp) Filter(ctx context.Context) (err error) {
	if in.Id <= 0 {
		err = gerror.New("主键id不能为空")
		return
	}

	if in.Status <= 0 {
		err = gerror.New("状态不能为空")
		return
	}

	if !validate.InSlice(consts.StatusSlice, in.Status) {
		err = gerror.New("状态不正确")
		return
	}
	return
}

type StoreOrderStatusModel struct{}
